﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace I3.AgenteIA.Dominio.Gramatica
{
    public class AnalisadorMorfologicoServico
    {
        /// <summary>
        /// Armazena o interpretador de sentenças
        /// </summary>
        private readonly SentencaInterpreter _sentencaInterpreter;
        private readonly ElementoInterpreter _elementoInterpreter;

        /// <summary>
        /// Construtor padrão do serviço de dominio responspavel
        /// pela realização da analise morfologica de uma sentença
        /// </summary>
        public AnalisadorMorfologicoServico(SentencaInterpreter sentencaInterpreter, ElementoInterpreter elementoInterpreter)
        {
            _sentencaInterpreter = sentencaInterpreter;
            _elementoInterpreter = elementoInterpreter;
        }

        /// <summary>
        /// Realiza a analise morfologica na oração 
        /// </summary>
        public void RealizarAnalise(Oracao oracao) 
        { 
            // Realiza a separação da sentenças individuais da oração.
            // e insere o resultado dentro do objeto que representa a oração.
            IEnumerable<Sentenca> sentencas = _sentencaInterpreter.Interpretar(oracao);

            // Realiza a analise de cada elemento para cada uma das 
            // sentenças individuais identificadas na oração.
            foreach (Sentenca sentenca in sentencas)
            {
                IEnumerable<Elemento> elementos = _elementoInterpreter.Interpretar(sentenca);
            }
        }

        /// <summary>
        /// Realiza a separação de todos os elementos do texto
        /// </summary>
        private List<Elemento> SepararElementos(string texto)
        {
            // Cria uma lista de elementos onde o delimitador deverá 
            // ser os espaços em branco.
            string[] elementos = texto.Split(' ');

            // Cria a lista de elementos do texto que será retornada 
            // pelo método.
            List<Elemento> listaDeElementos = new List<Elemento>();

            // Para cada caracter do elemento, verifica se ele 
            // faz parte de uma palavra ou se ele é um caracter especial
            foreach(string elemento in elementos)
            {
                // Cria um array com todos os caracteres do elemento atual
                // caso algum caracter especial que não pertenca ao elemento seja encontrado 
                // ele deverá ser separado
                char[] caracteres = elemento.ToArray();
                int posInicial = 0; int posFinal = 0;

                for (int i = 0, total = caracteres.Length; i < total; i++)
                {
                    // Caractere atual que será analisado
                    char caractere = caracteres[i];

                    // Se o caracter de trabalho não for um alfa-numerico
                    // o processo deseparação deverá ser executado.
                    if (!char.IsLetterOrDigit(caractere))
                    {
                        throw new NotImplementedException();
                    }

                    // Se encontrato algum caracter que ñão seja alfa numerico,
                    // o elemento atual de trabalho deverá ser separadado.
                    if (!char.IsLetterOrDigit(caractere))
                    {
                        listaDeElementos.Add(new Elemento(elemento.Substring(posInicial, posFinal)));
                        posInicial = posFinal;
                    }
                    else
                    {
                        posFinal++;
                    }
                }

                listaDeElementos.Add(new Elemento(elemento.Substring(posInicial, (posFinal - posInicial))));
            }

            return listaDeElementos;
        }
    }
}
